/**
 * N个商品，每个商品有一个价格Pi
 * A张折扣券，每张折扣券的比例为Xi%，即使用之后价格变为 P * Xi%
 * B张立减券，每张减Yi，即使用之后价格变为 max(P - Yi)
 * 问买完所有商品用的最少花费
 * 
 * 基于贪心首先明确几点
 * 1 优先对价格高的使用优惠券
 * 2 对于折扣券而言，优先使用折扣力度大的，也就是xi越小越先试用
 * 3 对于立减券，优先使用yi大的
 * 4 当商品数量少于A+B时，显然每个商品都要使用一种券
 * 
 * 因此首先对三个数组进行排序，然后令Dijk表示买了第i个商品，
 * 花了j张折扣券、k张立减券所能减免的最大力度，则
 * Dijk = max(D[i-1][j-1][k] + Pi * (1 - xi%), D[i-1][j][k-1] + min(Pi, yi))
 * 注意到i其实没有用，所以二维数组就够了。
 * 实际上是从左上角D00开始，每一次计算一个对角线
 * 此过程中出现的最大的数就是最大减免，然后用SIGMA{Pi}去减掉即可
 * 
 * 注意要保证下标有意义
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using Real = double;
using vi = vector<int>;

template<typename T>
void input(int&n, vector<T>&v){
    cin >> n;
    v.assign(n, {});
    for(auto & i : v) cin >> i;
    return;
}

int N;
int A, B;
vi P;
vi X, Y;

void mymax(Real & x, Real y){
    if(x < y) x = y;
}

Real proc(){
    sort(P.begin(), P.end(), greater<int>());
    sort(X.begin(), X.end());
    sort(Y.begin(), Y.end(), greater<int>());

    const Real INF = 1E100;
    vector<vector<Real>> D(A + 1, vector<Real>(B + 1, 0));
    Real ans = 0;
    D[0][0] = 0;
    for(int i=1;i<=min(N, A+B);++i){
        auto pi = P[i - 1];
        for(int j=0;j<=i;++j){
            int k = i - j;
            if(0 <= j and j <= A and 0 <= k and k <= B){
                if(1 <= j) mymax(D[j][k], D[j - 1][k] + pi * (100 - X[j - 1]) / 100.0);
                if(1 <= k) mymax(D[j][k], D[j][k - 1] + min(Y[k - 1], pi));
                ans = max(ans, D[j][k]);
            }
        }
    }
    ans = -ans;
    for(auto i : P) ans += i;
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        input(N, P);
        input(A, X);
        input(B, Y);
        cout << fixed << setprecision(12) << proc() << "\n";
    }
    return 0;
}